package com.ruoyi.system.manager.Impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.common.core.enums.DataRecordFlag;
import com.ruoyi.common.core.exception.ServiceException;
import com.ruoyi.system.domain.SysConfig;
import com.ruoyi.system.manager.SysConfigManager;
import com.ruoyi.system.mapper.SysConfigMapper;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;


/**
 * 直接操作数据库的接口方法， 不使用xml形式
 * @author jlc
 * @date 2022/9/3
 */
@Slf4j
@Service
public class SysConfigManagerImpl extends ServiceImpl<SysConfigMapper, SysConfig> implements SysConfigManager {

    /**
     * 查询参数配置信息
     *
     * @param config 参数配置信息
     * @return 参数配置信息
     */
    @Override
    public SysConfig selectConfig(SysConfig config) {
        LambdaQueryWrapper<SysConfig> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper
                .eq(StringUtils.isNotBlank(config.getConfigId().toString()), SysConfig::getConfigId, config.getConfigId())
                .eq(SysConfig::getDelFlag, DataRecordFlag.NORMAL.getCode())
                .eq(StringUtils.isNotBlank(config.getConfigKey()), SysConfig::getConfigKey, config.getConfigKey());
        return getOne(queryWrapper);
    }

    /**
     * 查询参数配置列表
     *
     * @param config 参数配置信息
     * @return 参数配置集合
     */
    @Override
    public List<SysConfig> selectConfigList(SysConfig config) {
        try {
            LambdaQueryWrapper<SysConfig> queryWrapper = new LambdaQueryWrapper<>();
            queryWrapper
                    .eq(config.getConfigId() != null, SysConfig::getConfigId, config.getConfigId())
                    .like(StringUtils.isNotBlank(config.getConfigKey()), SysConfig::getConfigKey, config.getConfigKey())
                    .like(StringUtils.isNotBlank(config.getConfigName()), SysConfig::getConfigName, config.getConfigName())
                    .eq(StringUtils.isNotBlank(config.getConfigType()), SysConfig::getConfigType, config.getConfigType())
                    .eq(SysConfig::getDelFlag, DataRecordFlag.NORMAL.getCode())
                    .ge(config.getCreateTime() != null, SysConfig::getCreateTime, config.getConfigType())
                    .le(config.getUpdateTime() != null, SysConfig::getCreateTime, config.getConfigType());
            return baseMapper.selectList(queryWrapper);
        } catch (Exception e) {
            throw new ServiceException("加载配置异常");
        }
    }

    /**
     * 根据键名查询参数配置信息
     *
     * @param configKey 参数键名
     * @return 参数配置信息
     */
    @Override
    public SysConfig checkConfigKeyUnique(String configKey) {
        LambdaQueryWrapper<SysConfig> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(SysConfig::getConfigKey, configKey)
                .eq(SysConfig::getDelFlag, DataRecordFlag.NORMAL.getCode());

        // 通过键名唯一查询到一条正常记录
        return getOne(queryWrapper);
    }

    /**
     * 新增参数配置
     *
     * @param config 参数配置信息
     * @return 结果
     */
    @Override
    public int insertConfig(SysConfig config) {
        if (config == null) {
            throw new ServiceException("保存配置不能为空");
        }
        boolean save = save(config);
        return 1;
    }

    /**
     * 修改参数配置
     *
     * @param config 参数配置信息
     * @return 结果
     */
    @Override
    public int updateConfig(SysConfig config) {
        if (config.getConfigId() == null) {
            throw new ServiceException("修改参数配置主键不能为空");
        }
        updateById(config);
        return 1;
    }

    /**
     * 删除参数配置
     *
     * @param configId 参数ID
     * @return 结果
     */
    @Override
    public int deleteConfigById(Long configId) {
        SysConfig sysConfig = getById(configId);
        if (sysConfig == null) {
            throw new ServiceException("查询到结果为空， 删除错误");
        }
        sysConfig.setDelFlag(DataRecordFlag.DELETED.getCode());
        updateById(sysConfig);
        return 1;
    }

    /**
     * 批量删除参数信息
     *
     * @param configIds 需要删除的参数ID
     * @return 结果
     */
    @Override
    public int deleteConfigByIds(Long[] configIds) {
        if (configIds.length < 1) {
            throw new ServiceException("批量删除数据不能为空");
        }
        LambdaUpdateWrapper<SysConfig> updateWrapper = new LambdaUpdateWrapper<>();
        updateWrapper.in(SysConfig::getConfigId, configIds)
                .set(SysConfig::getDelFlag, DataRecordFlag.DELETED.getCode());
        update(updateWrapper);
        return 1;
    }
}
